package algo3c3g3.model.action;

import algo3c3g3.model.*;
import org.jdom.Element;

import algo3c3g3.model.persistence.Persistence;

/**
 * La unidad destruye bloques en forma horizontal si el material es destructible.
 */
public class Basher extends Action
{
    private int attemptsFailed;
    
    private static final int MAX_ATTEMPTS_FAILED = 1;
    
    public Basher() {}
    
    public Basher(Element e)
    {
        load(e);
    }
    
    public void perform(Unit unit)
    {
        // Si se supera la cantidad de intentos fallados
        // la unidad se vuelve Walker.
        if(attemptsFailed > MAX_ATTEMPTS_FAILED)
        {
            unit.setAction(new Walker());
            return;
        }
        
        unit.materialEffectY();
        
        // No hay piso. Se vuelve Faller.
        if(unit.overSolidFloor() == false)
        {
            unit.setAction(new Faller());
            return;
        }
        
        // Hay piso.
        
        // Si el bloque es solido intenta destruirlo. Esto depende del matarial.
        // Si no puede destruirlo cuenta el intento fallado.
        if(unit.nextBlockIsSolid())
        {
            unit.getOwnerMap().breakBlock(unit.getNextSidePosition());
            attemptsFailed = 0;
        }
        else
            attemptsFailed++;
        
        unit.materialEffectX();
        
        if(unit.nextBlockIsSolid() == false)
            unit.walk();
    }
    
    @Override
    public Element save()
    {
        Element root = super.save();
        root.addContent(new Element("attemptsFailed").setText(Integer.toString(this.attemptsFailed)));
        return root;
    }

    @Override
    public void load(Element e)
    {
        this.attemptsFailed =
            Integer.parseInt(e.getChildText("attemptsFailed"));
    }

    
    
    public static void main(String[] args)
    {
        System.out.println();
        
        World world = new World(new Coord(2, 5), null, new TestMaps.TestBasherMap());
        
        System.out.println("Mapa:");
        world.printMap();
        
        world.addUnit();
        
        Unit unit1 = world.getUnit(0);
        
        System.out.println("\nNueva unidad:");
        unit1.printStatus();
        
        /* Mueve la unidad varias veces */
        System.out.println("\nCaminando hacia la derecha:");
        for(int i = 0; i < 4; i++)
        {
            world.moveUnits();
            unit1.printStatus();
        }
        
        System.out.println("\nAccion cambiada a Basher:");
        Basher basher=new Basher();
        unit1.setAction(basher);
        
        System.out.println("\nRompiendo bloques:");
        for(int i = 0; i < 5; i++)
        {
            world.moveUnits();
            unit1.printStatus();
        }
        
        System.out.println("\nMapa despues de romper:");
        world.printMap();
        
        System.out.println("\nSigue rompiendo bloques:");
        for(int i = 0; i < 20; i++)
        {
            world.moveUnits();
            unit1.printStatus();
        }
        
        System.out.println("\nMapa despues de romper:");
        world.printMap();
        
        Persistence.toXMLFile(basher.save(),"C:\\salida.xml");
    }
}
